﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using System.Configuration;
using System.Data;
using Entidades.Solicitud;

namespace Persistencia.Solicitud
{
    public class PerSolicitudAfectadoParticular : Persistencia.General.IPersistencia
    {
        public void Insertar(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);

            try
            {
                comando = new OracleCommand("PKG_SOLICITUD_AFECTADO.insertarafectadoparticular", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ((EntSolicitudAfectado)entidad).CvePredio;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                OracleParameter parametro2 = new OracleParameter();
                parametro2.OracleDbType = OracleDbType.Varchar2;
                parametro2.Value = ((EntSolicitudAfectado)entidad).PP_ErogacionVerbal;
                parametro2.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro2);

                OracleParameter parametro3 = new OracleParameter();
                parametro3.OracleDbType = OracleDbType.Varchar2;
                parametro3.Value = ((EntSolicitudAfectado)entidad).Observaciones;
                parametro3.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro3);

                OracleParameter parametro4 = new OracleParameter();
                parametro4.OracleDbType = OracleDbType.Varchar2;
                parametro4.Value = ((EntSolicitudAfectado)entidad).AreaAfectada;
                parametro4.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro4);

                OracleParameter parametro5 = new OracleParameter();
                parametro5.OracleDbType = OracleDbType.Varchar2;
                parametro5.Value = ((EntSolicitudAfectado)entidad).CveUsuario;
                parametro5.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro5);
                //
                OracleParameter parametro6 = new OracleParameter();
                parametro6.OracleDbType = OracleDbType.Varchar2;
                parametro6.Value = ((EntSolicitudAfectado)entidad).LongitudAfectada;
                parametro6.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro6);

                OracleParameter parametro7 = new OracleParameter();
                parametro7.OracleDbType = OracleDbType.Varchar2;
                parametro7.Value = ((EntSolicitudAfectado)entidad).KilometroInicial;
                parametro7.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro7);

                OracleParameter parametro8 = new OracleParameter();
                parametro8.OracleDbType = OracleDbType.Varchar2;
                parametro8.Value = ((EntSolicitudAfectado)entidad).KilometroFinal;
                parametro8.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro8);

                OracleParameter parametro9 = new OracleParameter();
                parametro9.OracleDbType = OracleDbType.Varchar2;
                parametro9.Value = ((EntSolicitudAfectado)entidad).CveTrabajoRealizar;
                parametro9.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro9);

                OracleParameter parametro10 = new OracleParameter();
                parametro10.OracleDbType = OracleDbType.Varchar2;
                parametro10.Value = ((EntSolicitudAfectado)entidad).FechaEnvioPermisoPaso;
                parametro10.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro10);

                OracleParameter parametro11 = new OracleParameter();
                parametro11.OracleDbType = OracleDbType.Varchar2;
                parametro11.Value = ((EntSolicitudAfectado)entidad).FechaObtencionPerPaso;
                parametro11.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro11);

                OracleParameter parametro12 = new OracleParameter();
                parametro12.OracleDbType = OracleDbType.Varchar2;
                parametro12.Value = ((EntSolicitudAfectado)entidad).ObservacionPP;
                parametro12.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro12);

                OracleParameter parametro13 = new OracleParameter();
                parametro13.OracleDbType = OracleDbType.Varchar2;
                parametro13.Value = ((EntSolicitudAfectado)entidad).MontoAfectacionAprobado;
                parametro13.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro13);
                // /
                OracleParameter parametro14 = new OracleParameter();
                parametro14.OracleDbType = OracleDbType.Varchar2;
                parametro14.Value = ((EntSolicitudAfectado)entidad).CveSolicitudAfectado;
                parametro14.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro14);

                OracleParameter parametro15 = new OracleParameter();
                parametro15.OracleDbType = OracleDbType.Varchar2;
                parametro15.Value = ((EntSolicitudAfectado)entidad).NoExpendiente;
                parametro15.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro15);

                OracleParameter parametro16 = new OracleParameter();
                parametro16.OracleDbType = OracleDbType.Varchar2;
                parametro16.Value = ((EntSolicitudAfectado)entidad).FechaComprometidaCompromiso;
                parametro16.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro16);

                OracleParameter parametro17 = new OracleParameter();
                parametro17.OracleDbType = OracleDbType.Varchar2;
                parametro17.Value = ((EntSolicitudAfectado)entidad).FechaCumplimientoCompromiso;
                parametro17.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro17);

                comando.ExecuteNonQuery();
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudAfectadoParticular.Insertar";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudAfectadoParticular.Insertar";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;
            }
        }

        public void Actualizar(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public void Eliminar(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            conexion.Open();

            comando = new OracleCommand("PKG_SOLICITUD_AFECTADO.eliminarafectadoparticular", conexion);
            comando.CommandType = System.Data.CommandType.StoredProcedure;

            try
            {
                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ((EntSolicitudAfectado)entidad).CveSolicitudAfectado;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);                

                comando.ExecuteNonQuery();
            }

            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje:  " + exc.Message);
                excepcion.Source = "PerSolicitudAfectadoParticular.Eliminar";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje:  " + exc.Message);
                excepcion.Source = "PerSolicitudAfectadoParticular.Eliminar";
                throw excepcion;
            }
            finally
            {
                comando = null;
                if (conexion != null)
                    if (conexion.State == System.Data.ConnectionState.Open) conexion.Close();
            }
        }

        public Entidades.General.IEntidad Obtener(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntSolicitudAfectado ent = null;

            try
            {
                comando = new OracleCommand("PKG_SOLICITUD_AFECTADO.getafectadoparticular", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Int32;
                parametro1.Value = ((EntSolicitudAfectado)entidad).CveSolicitudAfectado;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);


                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    ent = new EntSolicitudAfectado();
                    ent.CveSolicitudAfectado = int.Parse(lector["cve_solicitud_afectado"] == DBNull.Value ? "0" : lector["cve_solicitud_afectado"].ToString());
                    ent.CvePredio = int.Parse(lector["cve_predio"] == DBNull.Value ? "0" : lector["cve_predio"].ToString());
                    ent.CveTrabajoRealizar = int.Parse(lector["cve_trabajo_realizar"] == DBNull.Value ? "0" : lector["cve_trabajo_realizar"].ToString());
                    ent.CveUsuario = int.Parse(lector["cve_usuario"] == DBNull.Value ? "0" : lector["cve_usuario"].ToString());
                    ent.PP_ErogacionVerbal = lector["pp_erogacion_verbal"].ToString();
                    ent.Observaciones = lector["observaciones"].ToString();
                    ent.AreaAfectada = lector["area_afectada"].ToString();
                    ent.LongitudAfectada = lector["longuitd_afectada"].ToString();
                    ent.KilometroInicial = lector["kilometro_inicial"].ToString();
                    ent.KilometroFinal = lector["kilometro_final"].ToString();
                    ent.FechaEnvioPermisoPaso = lector["fecha_envio_permiso_paso"].ToString();
                    ent.FechaObtencionPerPaso = lector["fecha_obtencion_per_paso"].ToString();
                    ent.ObservacionPP = lector["observacion_pp"].ToString();
                    ent.MontoAfectacionAprobado = lector["monto_por_afectacion_aprobado"].ToString();
                    ent.NoExpendiente = lector["no_expediente"].ToString();
                    ent.FechaCumplimientoCompromiso = lector["fecha_cumplimiento_compromiso"].ToString();
                    ent.FechaComprometidaCompromiso = lector["fecha_comprometida_compromiso"].ToString();
                    ent.ComentariosCarga = lector["comentarios_carga"].ToString();
                    ent.FechaRegistro = lector["fecha_registro"].ToString();
                }
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudAfectadoFederal.Obtener";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudAfectadoFederal.Obtener";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
            return ent;
        }

        public List<Entidades.General.IEntidad> ObtenerTodos(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public List<Entidades.General.IEntidad> ObtenerTodos()
        {
            throw new NotImplementedException();
        }

        public List<Entidades.General.IEntidad> CriteriosObtenerTodos(string NoPredio, string TipoErogacion, string DescObra, string NombreAfectado)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntSolicitudAfectado ent = null;
            List<Entidades.General.IEntidad> lista = new List<Entidades.General.IEntidad>();

            try
            {
                comando = new OracleCommand("PKG_SOLICITUD_AFECTADO.getafectadoparticularcriterios", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter parametro0 = new OracleParameter();
                parametro0.OracleDbType = OracleDbType.Varchar2;
                parametro0.Value = (string.IsNullOrWhiteSpace(NoPredio) ? null : NoPredio);
                parametro0.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro0);

                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = (string.IsNullOrWhiteSpace(TipoErogacion) ? null : TipoErogacion);
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                OracleParameter parametro2 = new OracleParameter();
                parametro2.OracleDbType = OracleDbType.Varchar2;
                parametro2.Value = (string.IsNullOrWhiteSpace(DescObra) ? null : DescObra);
                parametro2.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro2);

                OracleParameter parametro3 = new OracleParameter();
                parametro3.OracleDbType = OracleDbType.Varchar2;
                parametro3.Value = (string.IsNullOrWhiteSpace(NombreAfectado) ? null : NombreAfectado);
                parametro3.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro3);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    ent = new EntSolicitudAfectado();
                    ent.CveSolicitudAfectado = int.Parse(lector["cve_solicitud_afectado"] == DBNull.Value ? "0" : lector["cve_solicitud_afectado"].ToString());
                    ent.CveTrabajoRealizar = int.Parse(lector["cve_trabajo_realizar"] == DBNull.Value ? "0" : lector["cve_trabajo_realizar"].ToString());
                    ent.CvePredio = int.Parse(lector["cve_predio"] == DBNull.Value ? "0" : lector["cve_predio"].ToString());
                    ent.CveSolicitud = int.Parse(lector["cve_solicitud"] == DBNull.Value ? "0" : lector["cve_solicitud"].ToString());
                    
                    ent.PP_ErogacionVerbal = lector["pp_erogacion_verbal"].ToString();

                    /*Se Tomo como Parches*/
                    ent.Observaciones = lector["no_predio"].ToString(); //No Predio
                    ent.ComentariosCarga = lector["Afectado"].ToString(); //Afectado
                    ent.NoExpendiente = lector["desc_obra"].ToString(); //Afectacion
                    /*End Se Tomo como Parches*/

                    ent.DescEstatus = lector["Estatus"].ToString();
                    ent.FechaEnvioPermisoPaso = lector["fecha_envio_permiso_paso"].ToString();
                    ent.FechaObtencionPerPaso = lector["fecha_obtencion_per_paso"].ToString();

                    ent.FechaRegistro = lector["F_Registro"].ToString();
                    ent.AreaAfectada = lector["Area_Afectada"].ToString();
                    ent.LongitudAfectada = lector["Longuitd_Afectada"].ToString();

                    ent.KilometroFinal = lector["Kilometro_Final"].ToString();
                    ent.KilometroInicial = lector["Kilometro_Inicial"].ToString();
                    ent.MontoAfectacionAprobado = lector["Monto_Por_Afectacion_Aprobado"].ToString();

                    lista.Add(ent);
                }
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudAfectadoParticular.CriteriosObtenerTodos";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudAfectadoParticular.CriteriosObtenerTodos";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
            return lista;
        }
    }
}
